package com.example.demo.mapper;

import com.example.demo.model.entity.relation.TeacherStudentRelation;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Optional;

/**
 * 教师学生关系映射器，用于操作教师学生关系表的数据库操作。
 */
@Mapper
public interface TeacherStudentRelationMapper {

    /**
     * 检查指定教师和学生之间的关系是否存在。
     *
     * @param teacherId 教师 ID
     * @param studentId 学生 ID
     * @return 如果关系存在返回 true，否则返回 false
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Select("SELECT COUNT(*) > 0 FROM teacher_student_relation WHERE teacher_id = #{teacherId} AND student_id = #{studentId}")
    boolean existsByTeacherIdAndStudentId(Long teacherId, Long studentId);

    /**
     * 根据教师 ID 查询所有与之关联的教师学生关系记录。
     *
     * @param teacherId 教师 ID
     * @return 教师学生关系记录列表
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Select("SELECT * FROM teacher_student_relation WHERE teacher_id = #{teacherId}")
    List<TeacherStudentRelation> findByTeacherId(Long teacherId);

    /**
     * 根据学生 ID 查询所有与之关联的教师学生关系记录。
     *
     * @param studentId 学生 ID
     * @return 教师学生关系记录列表
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Select("SELECT * FROM teacher_student_relation WHERE student_id = #{studentId}")
    List<TeacherStudentRelation> findByStudentId(Long studentId);

    /**
     * 根据教师 ID 和学生 ID 删除对应的教师学生关系记录。
     *
     * @param teacherId 教师 ID
     * @param studentId 学生 ID
     * @return 删除的记录数
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Delete("DELETE FROM teacher_student_relation WHERE teacher_id = #{teacherId} AND student_id = #{studentId}")
    int deleteByTeacherIdAndStudentId(Long teacherId, Long studentId);

    /**
     * 根据记录 ID 更新教师学生关系的类型。
     *
     * @param id           记录 ID
     * @param relationType 新的关系类型
     * @return 更新的记录数
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Update("UPDATE teacher_student_relation SET relation_type = #{relationType} WHERE id = #{id}")
    int updateRelationType(Long id, String relationType);

    /**
     * 根据教师 ID 和学生 ID 查询对应的教师学生关系记录。
     *
     * @param teacherId 教师 ID
     * @param studentId 学生 ID
     * @return 包含教师学生关系记录的 Optional 对象，如果记录不存在则返回空的 Optional
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Select("SELECT * FROM teacher_student_relation WHERE teacher_id = #{teacherId} AND student_id = #{studentId}")
    Optional<TeacherStudentRelation> findByTeacherIdAndStudentId(Long teacherId, Long studentId);

    /**
     * 插入一条新的教师学生关系记录。
     *
     * @param relation 教师学生关系对象，包含教师 ID、学生 ID、关系类型和创建时间
     * @throws org.apache.ibatis.exceptions.PersistenceException 执行 SQL 语句时可能抛出的异常
     */
    @Insert("INSERT INTO teacher_student_relation (teacher_id, student_id, relation_type, create_time) " +
            "VALUES (#{teacherId}, #{studentId}, #{relationType}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(TeacherStudentRelation relation);


}